Además del desarrollo en el lenguaje de programación C++ de la herramienta, se ha desarrollado un script en 
lenguaje MiniZinc \cite{MiniZinc} que modela las restricciones que deben cumplir las soluciones a un 
problema de planificación. Este script se ha diseñado de forma que sea independiente de los datos concretos que
componen la instancia de problema de planificación a resolver, siendo la herramienta la encargada de generar 
esos datos. Al ejecutar el script sobre un resolutor de restricciones que acepte MiniZinc \cite{MiniZinc} cómo
lenguaje de modelado de restricciones, tomará cómo datos los generados por la herramienta, pudiendo así buscar
soluciones al problema de planificación.

A continuación se detallan las partes del script que se consideran más interesantes.

\subsubsection{Declaración de parámetros de entrada}

Lo primero que detallaremos serán los parámetros de entrada del script. Estos parámetros son los 
que la herramienta generará y proporcionará al script al ejecutarlo sobre un resolutor de restricciones.

\begin{itemize}
 \item \textbf{int n\_tasks}: Número de tareas que componen el modelo.
 \item \textbf{int n\_resources}: Número de recursos que componen el modelo.
 \item \textbf{int max\_time}: Tiempo máximo para la planificación del modelo. Define el dominio del tiempo.
 \item \textbf{array[1..n\_precedences, 1..2] of int : precedences}: Array de precedencias formado por pares $<T1,T2>$, que indican
 que la tarea $T1$ ha de ejecutarse antes que las tarea $T2$.
  \item \textbf{array[1..n\_tasks] of 0..max\_time : lenght}: Array de duraciones de las tareas.
  \item \textbf{array[1..n\_tasks] of 1..n\_resources: resources}: Array de recursos necesarios para las tareas.
  \item \textbf{array[1..n\_tasks] of 0..max\_time : start\_time\_window}: Array de inicios de la ventana temporal de las tareas.
  \item \textbf{array[1..n\_tasks] of 0..max\_time : end\_time\_window}: Array de finales de la ventana temporal de las tareas. 
  \item \textbf{array[1..n\_resources] of 0..n\_tasks : capacity}: Array de capacidades de los recursos. 
\end{itemize}

Cómo se puede ver, junto con la declaración de estos parámetros se especifican el dominio de sus valores. Esto
de forma implícita introduce restricciones de dominio en el modelo, que acotan los valores que pueden tomar dichos
parámetros.

\subsubsection{Variables de decisión}

Los resolutores de restricciones trabajan sobre lo que se denominan ``variables de decisión''. Son un tipo especial de
variables, las cuales no tienen un valor fijo de antemano, si no que son sobre las que el resolutor ``razona'' para encontrar
soluciones al problema. El resolutor va asignando valores a estas variables, de forma que cuando tenga una combinación que cumpla
todos las restricciones del modelo significará que ha encontrado una solución al modelo.

\begin{itemize}
 \item \textbf{array[1..n\_tasks] of var 0..max\_time : start\_time}: Instantes de inicio de ejecución de la tareas.
 \item \textbf{array[1..n\_tasks] of var 0..max\_time : end\_time}: Instantes de finalización de las tareas. Debe cumplirse que
 $end\_time[i] = start\_time[i] + lenght[i] \forall i \in 0..n\_tasks$
 \item \textbf{array[0..max\_time, 1..n\_tasks, 1..n\_resources] of var 0..1: planning}: Matríz tridimensional que especifica
 para cada instante de tiempo $t$ y la tarea $T_i$, los recursos que tiene asignados. Es decir, si $planning[t,T,R] = 1 \Rightarrow$
 la tarea $T$ tiene asignado el recurso $R$ en el instante $t$.
\end{itemize}

Al igual que sucede con los parámetros, de forma impícita se tienen restricciones de dominio para las variables
de decisión definidas.

\subsubsection{Modelado de restricciones}

A continuación presentamos las restricciones presentadas en el apartado \ref{subsec:MODEL} implementadas en lenguaje MiniZinc
\cite{MiniZinc}:

\begin{itemize}
 \item \textbf{Restricción de para el instante de inicio de ejecución de la tarea}: El instante de inicio de la tarea debe 
 ser igual o posterior al tiempo minímo de inicio definido.
{
 \scriptsize
\begin{verbatim}
constraint
  forall( task in 1..n_tasks )
  (
    start_time[ task ] >= start_time_window[ task ]
  )
;
\end{verbatim}
}
 
 \item \textbf{Restricción de para el instante de final de ejecución de la tarea}: El instante de fin de la tarea debe 
 ser igual o anterior al tiempo máximo de inicio definido.
{
 \scriptsize
\begin{verbatim}
constraint
forall( task in 1..n_tasks )
  (
    end_time[ task ] <= end_time_window[ task ]
  )
;
\end{verbatim}
}
 
 \item \textbf{Restricción de capacidad de un recurso}: Para un instante de tiempo dado, un recurso no puede tener más tareas
 asignadas que las que le permite su capacidad.
{
 \scriptsize
\begin{verbatim}
constraint
  forall( resource in 1..n_resources )
  (
    forall ( time in 0..max_time )		
    (
      capacity[ resource ] 
      >= 
      sum( task in 1..n_tasks ) ( bool2int( planning[time,task,resource] = 1 ) )
    )
  )
;
\end{verbatim}
}
 
 \item \textbf{Restricciones de precedencia de tareas}: Dada una tarea $T1$, si está definida en el array de precedencias
 que debe ser ejecutada antes que otra tarea $T2$, entonces el instante de fin de la tarea $T1$ ha de ser igual o inferior al instante
 de comienzo de la tarea $T2$. 
{
 \scriptsize
\begin{verbatim}
constraint
  if do_precedences /\ n_precedences > 0 then
    forall( precendence in 1..n_precedences ) 
    (
      start_time[ precedences[ precendence, 1 ] ] + lenght[ precedences[ precendence, 1 ] ] 
      <= 
      start_time[ precedences[precendence,2] ]
    )
  else
    true
  endif
;
\end{verbatim}
}
 
 \item \textbf{Restricciones de número de recursos necesarios para una tarea}: Dada una tarea, el número de recursos que
 debe tener asignados en cada instante de su intervalo de ejecución ha de ser el número de recursos necesarios para poder
 llevarla a cabo.
{
 \scriptsize
\begin{verbatim}
constraint
  forall( task in 1..n_tasks )
  (
    forall( time in 0..max_time )
    (
      InRange( time, start_time[ task ], end_time[ task ] )
      ->
      sum( resource in 1..n_resources ) ( bool2int( planning[ time, task, resource ] = 1 ) ) 
      = 
      resources[ task ]
    )
  )
;
\end{verbatim}
}
 
\end{itemize}



